package com.jketing.controller.ams.sys;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.jketing.Config;
import com.jketing.bean.PageBean;
import com.jketing.entity.ams.sys.Function;
import com.jketing.entity.ams.sys.Role;
import com.jketing.service.ams.sys.OperationService;
import com.jketing.service.ams.sys.RoleService;

/**
 * Controller 请求处理
 * 
 * @author  李荣华
 * @version v1.0
 * @date    2017-12-22
 * @since   Spring-mvc 4.3.8
 */
@Controller
//@SessionAttributes(value={"role_flag","role_query","role_order","role_page"})
@RequestMapping("/role")
public class RoleController {

	/**
	 *  service 服务层自动注入
	 */
	@Autowired
	private RoleService service;
	/**
	 *  bs 	服务层自动注入
	 */
	@Autowired
	private OperationService bs;
	
	/**
	 *  @ModelAttribute方法 	得到实体数据放入Request
	 *  功能:在更新数据时，若只是提交了实体的部分数据，没有此方法直接更新将丢失表单没提交的数据，
	 *  为了防止未提交数据丢失，提供如下功能：
	 *  1、此方法先从数据库读取一次对象数据放入请求域；
	 *  2、待更新表单提交更新数据时，Srping-MVC会从请求域拿出此对象和表单提交数据合并后以入参方式传给目标方法
	 *  3、目标方法拿到最后合并的对象，调用service的更新方法更新数据库
	 *  4、此方法由Srping-MVC自动调用
	 * 	 
	 *  @param 	String		id		实体id		
	 *  @param  Map<String, Object>	map	Request数据键值对影射
	 *  
	 *  @return void
	 */
	@ModelAttribute
	public void getRole(@RequestParam(value="id",required=false) 
							String id,
							Map<String, Object> map){
		if(id != null){//在有id时查数据库 
			Role entity = service.findOne(id);//getOne会出现handler	JavassistLazyInitializer，使用用jackson转换是出错
			//若实体的关联对象要变更，如有员工实体引用了部门实体，在员工编辑页修改了部门提交；
			//在此要将员工关联部门对象设为null,不为null调用员工更新方法将报错；
			//调用形式：employee.setOrgan(null);
			//此处增加设null关联对象代码
			
			//1.map的key在默认情况下，必顺为要存值类名第一个字母小写的名称；
			//2.如这里entity类型是Role类，其key名必为：role
			//3.除非在目标方法入参前加有@ModelAttribute修饰，并设置了value值名称，可用其它名
			map.put("role", entity);
		}
	}
	
	/**
	 *  list 处理多条件查询分页排序请求
	 * 	 
	 *  @param	Role	query	查询条件封装
	 *  @param	String	order	排序字段名
	 *  @param 	String	page	页码
	 *  @param  HttpSession session	注入原生API
	 *  @param  Map<String, Object>	map	模型数据返回
	 *  
	 *  @return String	返回页面路径
	 */
	@RequestMapping("/list")
	public String list(Role query,
					   @RequestParam(value="order", 
								  required=false, 
								  defaultValue="id desc") 
						String order,
						String page,
						@RequestParam(value="vQuery", 
									  required=false, 
									  defaultValue="0") 
						String vQuery,
						HttpSession session,  
						Map<String, Object> map){
		String type = (String)session.getAttribute("type");
		if("redirect".equals(type)) {
			query = (Role)session.getAttribute("query");
			order = session.getAttribute("order")!=null?session.getAttribute("order").toString():null;
			page = session.getAttribute("page")!=null?session.getAttribute("page").toString():null;
		}
		session.removeAttribute("type");
		session.removeAttribute("query");
		session.removeAttribute("order");
		session.removeAttribute("page");
		int pageNo = 1;
		try {
			//对 pageNo 的校验
			pageNo = Integer.parseInt(page);
			if(pageNo < 1){
				pageNo = 1;
			}
		} catch (Exception e) {}
		map.put("order", order);
		map.put("page", page);
		map.put("vQuery", vQuery);
		map.put("query", query);
		PageBean<Role> pageBean = service.getPageBean(query,order,pageNo,Config.getPageSize());
		map.put("pageBean", pageBean);
		return "sys/role/list";
	}
	
	/**
	 *  input 				进入新增编辑页
	 *  REST风格获取URL：role/，GET请求
	 *  
	 *  @param	Map<String, Object>	map	页面数据返回
	 *  
	 *  @return	String	返回页面路径
	 */
	@RequestMapping(method=RequestMethod.GET)
	public String input(Map<String,Object> map){
		map.put("entity", new Role());
		map.put("butList", bs.findAll());
		return "sys/role/edit";
	}
	
	/**
	 *  input	进入更新编辑页
	 *  REST风格获取URL：role/{id}，GET请求改为POST请求，因在进入更新页时要接收查询表单条件
	 *  @param	Map<String, Object>	map	页面数据返回
	 *  
	 *  @return	String	返回页面路径
	 */
	@RequestMapping(value="/{id}", method=RequestMethod.POST)
	public String input(@PathVariable("id") String id,
						Role query,
						String order,
						String page,
						HttpSession session,
						Map<String, Object> map){
		List<Function> funList = service.getFunList(id);
		map.put("entity", service.getOne(id));
		map.put("butList", bs.findAll());
		map.put("funList", funList);
		map.put("resultJson", service.getFunButJson(id, funList));
		query.setId(null);//Spring-MVC把命令行id自动填到了查询实体中，故要设为null
		//因更新后会重定向到列表，使用session保存翻页条件在多个请求中共享数据
		session.setAttribute("type", "redirect");
		session.setAttribute("query", query);
		session.setAttribute("order", order);
		session.setAttribute("page", page);
		return "sys/role/edit";
	}
	
	/**
	 *  save	保存实体
	 *  REST风格新增URL：role/，POST请求
	 *  
	 *  @param	Role	entity	接收页面提交数据封装实体
	 *  
	 *  @return	String	返回页面路径
	 */
	@RequestMapping(method=RequestMethod.POST)
	public String save(Role entity,String resultJson){
		service.save(entity,resultJson);
		return "redirect:/role/list";
	}
	
	/**
	 *  update	更新实体
	 *  REST风格更新URL：role/{id}，PUT请求
	 *  
	 *  @param	Role	entity	接收页面提交数据封装实体
	 *  
	 *  @return	String	返回页面路径
	 */
	@RequestMapping(value="/{id}",method=RequestMethod.PUT)
	public String update(Role entity,String resultJson){
		service.update(entity,resultJson);
		return "redirect:/role/list";
	}
	
	/**
	 *  delete	删除实体
	 *  REST风格删除URL：role/{id}，DELETE请求
	 *  
	 *  @param	Role	entity	接收页面提交数据封装实体
	 *  
	 *  @return	String	返回页面路径
	 */
	@RequestMapping(value="/{ids}",method=RequestMethod.DELETE)
	public String delete(@PathVariable("ids") String ids,
						Role query,
						String order,
						String page,
						HttpSession session){
		if(StringUtils.isNoneBlank(ids)){
			String[] array = ids.split(",");
			for(int i=0;i<array.length;i++){
				service.delete(array[i]);
			}
		}
		//因是重定向到列表，使用session保存翻页条件在多个请求中共享数据
		session.setAttribute("type", "redirect");
		session.setAttribute("query", query);
		session.setAttribute("order", order);
		session.setAttribute("page", page);
		return "redirect:/role/list";
	}
}
